<?php
/*
 * Хранилище групп. В основе ассоциативный массив.
 * Примечательно то что в группах важен как порядок самих групп так и порядок сообществ которые в этих группах живут.
 * 
 * @author Alexander Sibiryakov 24.04.2008
 */
class CatalogContainer {
	private $groups; // тут лежат сами группы
	private $layout; // тут лежит порядок в котором нужно выдавать эти группы
	
	public function addGroup($group_oid, $name) {
		$group = array(
			"name"=>$name,
			"layout"=>array(),
			"oid"=>$group_oid
		);
		$this->groups[$group_oid] = $group;
		array_unshift($this->layout, $group_oid);
		
	}
	
	public function rmGroup($group_oid) {
		unset($this->groups[$group_oid]);
		$del_key = array_search($group_oid, $this->layout);
		unset($this->layout[ $del_key ]);
	}
	
	public function getGroups() {
		$r = array();

		foreach ($this->layout as $oid) {
			$r[] = $this->groups[$oid];
		}
		return $r;
	}
	
	public function changeGroupName($oid, $name) {
		$this->groups[$oid]["name"] = $name;
	}
	
	public function updateGroupsLayout(array $layout) {
		// обновит порядок групп
		$this->layout = $layout;
	}
	
	public function updateCommunityLayoutInGroup($group_oid, $layout) {
		// обновит порядок сообществ внутри группы
		$this->groups[$group_oid]["layout"] = $layout;
	}
}

class Action_Node_CommunitiesCatalog extends RL_Handler
{
	var $ajax_functions = array(
		'ajax_addGroup',
		'ajax_upCommunityGroupLayout',
		'ajax_rmGroup',
		'ajax_setGroupName',
		'ajax_upGroupLayout'
	);
	
	private $cc; // экземпляр CatalogContainer
	private $node; // экземпляр fobject
	
	public function ajax_upGroupLayout($layout) {
		$this->cc->updateGroupsLayout($layout);
	}
	
	public function ajax_setGroupName($group_oid, $name) {
		$this->cc->changeGroupName($group_oid, $name);
	}
	
	public function ajax_rmGroup($group_oid) {
		$this->cc->rmGroup($group_oid);
	}
	
	public function ajax_upCommunityGroupLayout($group_oid, $layout) {
		$this->cc->updateCommunityLayoutInGroup($group_oid, $layout);
	}
	
	public function ajax_addGroup($group_oid, $new_name) {
		$this->cc->addGroup($group_oid, $new_name);
	}
	
	public function init() {
		$this->rh->UseClass('RL_CyrDate');
		$this->acla = $this->module->aa;
		$this->acld = $this->acla->getInfo();
		$this->acla->getAvailableOperations();
		$this->store = &$this->ctx->store;
		
		$rs = $this->store->find("objects where objects.type = :0 limit 0,1", array("fnode"));
		if ($rs) {
			$node = $rs->next();
			if (isset($node->data["сatсontainer"])) {
				$this->cc = unserialize($node->data["сatсontainer"]);
			} else {
				// создать и положить им контейнер если его еще нету
				$cc = new CatalogContainer();
				$this->cc = $cc;
			}
			//$this->cc = new CatalogContainer(); // сбросить содержимое контейнера
			$this->node = $node;
		}
		
		$this->rh->UseClass("RL_URLGenerator");
	}
	
	public function shutdown() {
		$this->node->data["сatсontainer"] = serialize($this->cc);
		$this->node->save();
	}
	
	public function process()
	{
		if (false) { // тут надо как то организовать проверку на права
			echo "Access dnd";
			return;
		}
		$groups = $this->cc->getGroups();
		
		$communities = array();
		$rs = $this->store->find("objects where objects.type = :0 and objects.is_deleted=0 order by objects.ctime desc", array("fcommunity"));
		if ($rs)
		while ($obj = $rs->next()) {
			$communities[$obj->id] = array_merge($obj->data, array(
				'ctime' => RL_CyrDate::newFromStr("%Y-%m-%d %H:%i:%s", $obj->ctime),
				'oid' => $obj->id
			)); 
		}
		
		// положим в группы соответствующие сообщества
		foreach ($groups as $key=>$grp) {
			$comm_s = array();
			foreach ($grp['layout'] as $comm_oid) {
				$comm_s[] = $communities[$comm_oid];
				unset($communities[$comm_oid]); 
			}
			$groups[$key]["communities"] = $comm_s;
		}
					
		// set view
		$view = $this->rh->views->findByName('communities_cat');
		$view->data = $this->template_data;
		$view->data['groups'] = $groups;
		$view->data['gen_group_comm_s'] = $communities;
		
		$ug = new RL_URLGenerator($this->rh->router->getRule('community_cat_ajax'));
		$ug->setRouter($this->rh->router);
		$ug->setParams($this->params);

		$view->data['ajax_url'] = $ug->generateUrl();
		$this->rh->response->setContent( $view );
	} // end of function process

}
